package com.allen.app.common.config.aspect;

import com.allen.app.common.config.redis.redisson.LockType;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 安全性：保证互斥，任何时间至多只有一个客户端可以持有锁
 * 免死锁：即使当前持有锁的客户端崩溃或者从集群中被分开了，其它客户端最终总是能够获得锁。
 * 容错性：只要大部分的 Redis 节点在线，那么客户端就能够获取和释放锁。
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DistributedLock {

    /**
     * 锁名称。支持SpEL(例如：'字符串:'+#paramName)
     */
    String name() default "'default'";

    /**
     * 锁类型（默认可重入锁）
     */
    LockType type() default LockType.REENTRANT_LOCK;

    /**
     * 并发客户端获取锁的等待时间，默认3秒（安全性）
     */
    long waitTime() default 3000L;

    /**
     * 获取到锁的客户端如果超过leaseTime还没有解锁的话, 就强制解锁（免死锁）
     */
    long leaseTime() default 30000L;

    /**
     * 时间单位（获取锁等待时间和持锁时间都用此单位）
     */
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    /**
     *
     * 注解生效开关
     */
    boolean enabled() default true;
}

